package org.jim.server.processor;

import org.jim.core.ImChannelContext;
import org.jim.core.ImConst;
import org.jim.core.ImPacket;
import org.jim.core.packets.Message;
import org.jim.server.adapter.MessageConverter;
import org.jim.server.adapter.MessageConverterFactory;

/**
 * @author WChao
 * @Desc 不同协议CMD命令处理器接口
 * @date 2020-05-02 14:31
 */
public interface ProtocolCmdProcessor extends ImConst {

    /**
     * cmd命令处理器方法
     * @param imChannelContext IM通道上下文
     * @param message 消息（手动设置或者由getMessage传入）
     */
    void process(ImChannelContext imChannelContext, Message message);
    /**
     * 运行类型:manual手动执行，sync同步执行，async异步执行
     */
    public enum RunTypeEnum{
        RUN_TYPE_MANUAL("manual"),
        RUN_TYPE_SYNC("sync"),
        RUN_TYPE_ASYNC("async");
        private String type;
        RunTypeEnum(String type){
            this.type = type;
        }
    }
    RunTypeEnum getRunType();
    /**
     * 交给自动处理器执行的消息，如果RunType=manual，则不需要设置
     * @param imPacket
     * @param channelContext
     * @return
     */
    default Message getMessage(ImPacket imPacket,ImChannelContext channelContext){
        //使用转换器自动设置消息
        MessageConverter messageConverter = MessageConverterFactory.getConverter(imPacket.getCommand().getNumber());
        return messageConverter == null? null : messageConverter.convert(imPacket.getBody(), channelContext);
    };

}
